"""
数据库优化器配置模块

负责管理数据库优化过程中的各种配置参数、常量定义和默认设置。
提供灵活的配置接口，支持自定义优化选项。
"""

import os
from typing import Dict, Any, Optional


class OptimizerConfig:
    """
    数据库优化器配置类
    
    管理数据库优化过程中的所有配置参数，包括进度更新策略、日志级别等。
    支持从字典加载配置和获取默认配置。
    """
    
    # 优化步骤的进度权重配置
    DEFAULT_STEP_WEIGHTS = {
        'vacuum': 30,        # VACUUM操作占30%进度
        'reindex': 40,       # 索引重建占40%进度
        'cleanup': 10,       # 数据清理占10%进度
        'analyze': 20        # 统计分析占20%进度
    }
    
    # 默认优化选项
    DEFAULT_OPTIONS = {
        'enable_vacuum': True,      # 启用VACUUM操作
        'enable_reindex': True,     # 启用索引重建
        'enable_cleanup': True,     # 启用数据清理
        'enable_analyze': True,     # 启用统计分析
        'exclude_system_tables': True,  # 排除系统表
        'max_retries': 3            # 最大重试次数
    }
    
    def __init__(self, config_dict: Optional[Dict[str, Any]] = None):
        """
        初始化优化器配置
        
        Args:
            config_dict: 可选的配置字典，用于覆盖默认配置
        """
        # 初始化进度权重
        self.step_weights = self.DEFAULT_STEP_WEIGHTS.copy()
        
        # 初始化优化选项
        self.options = self.DEFAULT_OPTIONS.copy()
        
        # 如果提供了配置字典，则更新配置
        if config_dict:
            self.update_config(config_dict)
    
    def update_config(self, config_dict: Dict[str, Any]) -> None:
        """
        更新配置参数
        
        Args:
            config_dict: 包含要更新的配置项的字典
        """
        # 更新进度权重
        if 'step_weights' in config_dict:
            self.step_weights.update(config_dict['step_weights'])
        
        # 更新优化选项
        if 'options' in config_dict:
            self.options.update(config_dict['options'])
    
    def get_option(self, option_name: str, default: Any = None) -> Any:
        """
        获取特定优化选项的值
        
        Args:
            option_name: 选项名称
            default: 默认值，当选项不存在时返回
            
        Returns:
            选项值或默认值
        """
        return self.options.get(option_name, default)
    
    def get_step_weight(self, step_name: str, default: int = 0) -> int:
        """
        获取特定步骤的进度权重
        
        Args:
            step_name: 步骤名称
            default: 默认权重，当步骤不存在时返回
            
        Returns:
            步骤权重
        """
        return self.step_weights.get(step_name, default)
    
    def to_dict(self) -> Dict[str, Any]:
        """
        将配置转换为字典格式
        
        Returns:
            包含所有配置的字典
        """
        return {
            'step_weights': self.step_weights.copy(),
            'options': self.options.copy()
        }
    
    @classmethod
    def get_default_config(cls) -> 'OptimizerConfig':
        """
        获取默认配置实例
        
        Returns:
            默认配置的OptimizerConfig实例
        """
        return cls()